package polymorphsm1;

public class Test {
    // 多态性:包括对象多态和行为多态
    //成员变量没有多态
    //多态的好处：
    // 1.右边对象是解耦合的
    // 2.父类类型的变量作为参数，可以接收任意子类对象作为参数
    //多态的弊端：
    // 1.多态下不能调用子类独有方法

    public static void main(String[] args) {
        Man m1 = new Student();
        m1.listen();//编译类型是Man，运行类型是Student
        System.out.println(m1.name);

        Man m2 = new Teacher();
        m2.listen();
        System.out.println(m2.name);
        System.out.println("===================");

        //强制类型转换：可以解决多态下不能调用子类独有方法的弊端
        Student t1 = (Student) m1;
        t1.study();

        Teacher t2 = (Teacher) m2;
        t2.teach();

        System.out.println("===================");
        doing(m1);
        doing(m2);
    }
    public static void doing(Man m){

        //java 建议强制转换前，先判断是否是该类型，以免出现运行时异常
        if(m instanceof Student){
            Student t1 = (Student) m;
            t1.study();
        }else if(m instanceof Teacher){
            Teacher t2 = (Teacher) m;
            t2.teach();
        }
    }
}
